package com.wll.design.单例;

import lombok.Data;

/**
 * @ClassName: Single
 * @Description: 单例模式   懒汉  饿汉
 * @Author: wanglulu
 * @Date: 2021/11/12 17:07
 */
@Data
public class User {

    private String name;

    private String address;

    /**
     * 懒汉  使用时才创建
     */
    private volatile static User initUser = null;

    /**
     * 饿汉  不管有没有 只要实例化就创建
     */
    private static User user1 = new User();

    /**
     * 构造器私有  外部就不能实例化
     * 就得提供一个 实例化该类的静态方法
     */
    private User() {
        System.out.println("创建User");
    }

    /**
     * @Description: 提供外部要使用User  调用该方法
     * 多线程调用时就用问题  需要加锁
     * @Author: wanglulu
     * @Date: 2021/11/12 17:24
     * <p>
     * public static synchronized   User createUser(){  锁太大
     * 锁可以加在代码快上  使锁最小化
     * synchronized (User.class){
     * if(user == null){
     * user = new User();
     * }
     * }
     * **************************************
     * 双重锁检查 + 内存可见性
     */
    public static User invokeUser() {
        // 如果没有 才创建  懒汉式
        if (initUser == null) {
            synchronized (User.class) {
                if (initUser == null) {
                    User user = new User();
                    initUser = user;
                }
            }
        }
        return initUser;
    }


    /**
     * @Description: 提供外部要使用User  调用该方法  饿汉式
     * @Author: wanglulu
     * @Date: 2021/11/12 17:24
     * @Param:
     * @Return:
     */
    public static User invokeUser1() {
        return user1;
    }
}
